package com.tipcp.equip.collect.utils;

import com.digitalpetri.modbus.master.ModbusTcpMaster;
import com.digitalpetri.modbus.master.ModbusTcpMasterConfig;
import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
import com.tipcp.equip.collect.constant.ModbusConstant;
import com.tipcp.equip.collect.domain.Equip;
import io.netty.buffer.ByteBuf;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;

public class ModbusMasterUtils {
    /**
     * 创建ModbusTcp
     * @param equip 设备信息
     */
    public static ModbusTcpMaster create(Equip equip){
        ModbusTcpMasterConfig masterConfig = new ModbusTcpMasterConfig.Builder(equip.getIp()).setPort(equip.getPort()).build();
        return new ModbusTcpMaster(masterConfig);
    }

    /**
     * 小端与大端的转换 (针对4个字节的转换，32位下，一个int/float对应4个字节)
     * @param from 需进行转换
     * @param to 转换后的
     */
    public static byte[] convertEndian(byte[] bytes, ByteOrder from, ByteOrder to) {
        int value = ByteBuffer.wrap(bytes).order(from).getInt();
        return ByteBuffer.allocate(ModbusConstant.READ_TWO_REGISTER).order(to).putInt(value).array();
    }


    /**
     * 在保持寄存器中取指定索引位置的值
     * @param response modbusTcp请求的响应对象
     * @param index 寄存器地址
     * @return int/float类型
     * //TODO 目前只针对这两种数据类型，后续如需补充再调整
     */
    public static float getFloatByResponse(ReadHoldingRegistersResponse response, int index,int countBytes){
        ByteBuf byteBuf = response.getRegisters();
        byte[] bytes = new byte[countBytes];
        byteBuf.getBytes(index,bytes);
        return ByteBuffer.wrap(convertEndian(bytes,ByteOrder.LITTLE_ENDIAN,ByteOrder.BIG_ENDIAN)).getFloat();
    }
}
